libbpf: fix readelf output parsing on powerpc with recent binutils
authorAurelien Jarno <aurelien@aurel32.net>
Sun, 1 Dec 2019 19:35:55 +0000 (20:35 +0100)
committerSalvatore Bonaccorso <carnil@debian.org>
Thu, 13 Feb 2020 05:14:49 +0000 (05:14 +0000)
Origin: https://lore.kernel.org/patchwork/patch/1161149/

On powerpc with recent versions of binutils, readelf outputs an extra
field when dumping the symbols of an object file. For example:

    35: 0000000000000838    96 FUNC    LOCAL  DEFAULT [<localentry>: 8]     1 btf_is_struct

The extra "[<localentry>: 8]" prevents the GLOBAL_SYM_COUNT variable to
be computed correctly and causes the checkabi target to fail.

Fix that by looking for the symbol name in the last field instead of the
8th one. This way it should also cope with future extra fields.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Gbp-Pq: Topic bugfix/ppc64el
Gbp-Pq: Name libbpf-fix-readelf-output-parsing-on-powerpc-with-re.patch

tools/lib/bpf/Makefile

index 33e2638ef7f0d5b4b8ae28a23b43521358e40575..122321d549227ff048c53c522bde620b7be0514b 100644 (file)
@@ -145,7 +145,7 @@ PC_FILE             := $(addprefix $(OUTPUT),$(PC_FILE))
 
 GLOBAL_SYM_COUNT = $(shell readelf -s --wide $(BPF_IN_SHARED) | \
                           cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' | \
-                          awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}' | \
+                          awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}' | \
                           sort -u | wc -l)
 VERSIONED_SYM_COUNT = $(shell readelf -s --wide $(OUTPUT)libbpf.so | \
                              grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 | sort -u | wc -l)
@@ -217,7 +217,7 @@ check_abi: $(OUTPUT)libbpf.so
                     "versioned in $(VERSION_SCRIPT)." >&2;              \
                readelf -s --wide $(BPF_IN_SHARED) |                     \
                    cut -d "@" -f1 | sed 's/_v[0-9]_[0-9]_[0-9].*//' |   \
-                   awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$8}'|   \
+                   awk '/GLOBAL/ && /DEFAULT/ && !/UND/ {print $$NF}'|  \
                    sort -u > $(OUTPUT)libbpf_global_syms.tmp;           \
                readelf -s --wide $(OUTPUT)libbpf.so |                   \
                    grep -Eo '[^ ]+@LIBBPF_' | cut -d@ -f1 |             \